clojure.core のコレクションに関する var
Clojure におけるコレクションは、clojure.lang.IPersistentCollection インタフェースを実装したインスタンス
https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/IPersistentCollection.java
関数
empty: 引数のコレクションと同じ型の空のコレクションを返す
code:clj
(map empty [1 2 3 '(1 2 3) {:a 1 :b 2 :c 3} #{1 2 3}])
;; ([] () {} #{})
引数が nil の場合は nil を返す
code:clj
(empty nil) ; nil
coll?: 引数が IPersistentCollection インタフェースを実装しているか
具体的には、リストやベクタ、セット、マップの場合に true を返す
code:clj
(map coll? [ #{} {}]) ; (true true true true)
(map coll? 1 :keyword nil "string") ; (false false false false)
empty?: 引数が空のコレクションか
code:clj
(empty? []) ; true
(empty? 1 2 3) ; false
warning.icon シーケンス の場合は seq を使ったほうが良い
seq: シーケンスが空の場合は nil を、そうでない場合はシーケンスそのものを返す
理由
empty? は (not (seq x)) で実装されているため、(empty? x) は (not (not (seq x))) となり処理が無駄
code:clj
(defn empty?
coll (not (seq coll)))
not-empty: 引数のコレクションが空であれば nil を、そうでなければ引数をそのまま返す
code:clj
(not-empty []) ; nil
(not-empty 1 2 3) ; 1 2 3
引数が nil の場合も nil を返す
code:clj
(not-empty nil) ; nil
count: 引数のコレクションの要素数を返す
code:clj
(count 1 2 3) ; 3
(count {:a 1 :b 2}) ; 2
nilを渡すと 0 を返す
code:clj
(count nil) ; 0
文字列や配列、Java のコレクションやマップにも対応
code:clj
(count "あいうえお") ; 5
conj: コレクションに要素を追加した、新しいコレクションを返す
追加する位置はどのコレクションかによって異なる
e.g. ベクタは末尾、リストは先頭
code:clj
(conj 1 2 3 4) ; 1 2 3 4
(conj '(1 2 3) 4) ; (4 1 2 3)
(conj #{1 2 3} 4) ; #{1 4 3 2}
nil のみを渡すと nil を返すが、要素も渡すとリストとして返す
code:clj
(conj nil) ; nil
(conj nil 1) ; (1)
引数を渡さない場合、空のベクタを返す
code:clj
(conj) ; []
get: 連想配列やコレクション、文字列、配列、ILookup インタフェースを実装しているインスタンスからキーに対応する値を取得する
code:clj
(get {:a 1 :b 2} :a) ; 1
(get 1 2 3 1) ; 2
(get "foo" 0) ; \f
キーが存在しない場合は、第 3 引数で渡した値か nil を返す
code:clj
(get {:a 1 :b 2} :c) ; nil
(get {:a 1 :b 2} :c 0) ; 0
数値に使用してもエラーではなく nil を返す
code:clj
(get 1 :a) ; nil
マクロ
for: リスト内包表記
1 つ以上の 束縛 形式 / コレクション式の組からなるベクタを受け取り、遅延シーケンス を生成する
コレクションは右から反復され、前の束縛形式で作られた束縛を参照できる
code:clj
(for x (range 10) y (range 5)
x y)
;; (0 0 0 1 0 2 0 3 0 4
;; 1 0 1 1 1 2 1 3 1 4
;; 2 0 2 1 2 2 2 3 2 4
;; 3 0 3 1 3 2 3 3 3 4
;; 4 0 4 1 4 2 4 3 4 4
;; 5 0 5 1 5 2 5 3 5 4
;; 6 0 6 1 6 2 6 3 6 4
;; 7 0 7 1 7 2 7 3 7 4
;; 8 0 8 1 8 2 8 3 8 4
;; 9 0 9 1 9 2 9 3 9 4)
また、:let [束縛形式 式 ...] で新しい束縛を追加したり, :while や :when でコレクションの要素を選択的に処理できる
code:clj
(for x (range 3) :when (even? x)
(* x x))
;; (0 4)
(for x (range 10) :while (< x 5) y (range 3) :when (odd? y)
x y)
;; (0 1 1 1 2 1 3 1 4 1)
#Clojure